# Changelog

## 31 Mar 2023: v5.1

- `sp.filters`: Переведено на использование датаклассов.
- `sp.spm`: Нормальное отображение номеров уроков в списке изменений.
- `sp.spm`: Исправлено отображение пустых результатов поиска.
- `sp.spm`: Исправлено отображения расписания для внеурочного времени.
- `sp.spm`: Исправлена отправка результатов поиска.


## 27 Mar 2023: v5.0

Общее улучшение качества кода.
Смена мажорной версии обусловлена разбиением `sp.py` на множество файлов.
Цикл обновлений с целью полной переработкой проекта завершён.

**Schedule**:

- `_uppdate_diff_file()`: теперь использует `collections.deque`.
- Вернулся метод `search()`: для поиска данных в расписании
- Улучшено обращение с пользователями, не указавшими класс.
- Метод `get_updates()` для более гибкого получения списка обновлений.

**SPMessages**:

- `set_class()` больше не возвращает результат работы.
- Метод `reset_user()` для сброса данных пользователя.
- Изменён стиль списка измененений.
- Совмещены методы `search_lesson()` и `search_cabinet()`.
- `send_day_lessons()`: Сильно изменён формат отображения уроков.
- `send_lessons()`: При изменении расписания отображает сам список изменений.
- Изменён формат отображения уроков.
- Удалён метод `send_users_stats()`.
- `send_today_lessons()`: Вернулось умное отображение расписания.

**Telegram**:

- Обновления бота до `v1.8`.
- Совмещены команды `/start` и `/help`.
- Вернулись наименовая для кнопок в справке.
- В справке теперь отмечается выбранный пользователем класс.
- Добалена возможность отвзять пользователя от класса.
- Изменены тексты сообщений для большей их ясности.
- Исправлено получение расписния по команде `/sp`.
- Удалена команда `/users`.


## 15 Mar 2023: v4.6

- `Filter`: Класс, предоставляющий набор фильтров при получении расписания.
- `send_update()`: Вынесена как отдельная функция.
- `send_day_lessons()`: Вынесена как отдельная функция.

**Schedule**:

- Убрана возможность переопределить пути хранения файлов.
- Как обязательный аргумент принимает класс.
- Удалён метод `search()` за ненадобностью.
- Из `SPMeaasges` перенесены `get_class()` и `get_lessons()`.

**Spmessages**:

- Убрана возможность переопределить пути хранения файлов.
- Больше не требует класс `Schedule` как аргумент.
- `send_users_stats()`: Отправляет статистику о пользователях.
- Малость изменены тексты сообщений.
- `send_lessons()`: Переведён на использлвание `Filters`.
- `send_today_lessons()`: Переведён на использлвание `Filters`.
- `send_today_lessons()`: Переведено на статическое смещение дней.
- `count_lessons()`: Испралвена совместимость со старыми версиями Python.
  - Переведено на использование `Filters`.
  - Изменение стиля сообщения.
- `search_cabinet()`: Переведено на использование `Filters`.
  - Изменение стиля сообщения.

**Telegram**:

- Обновлено до `sp v4.6`.
- Изменены сообщения бота.
- `updates_command()`: Исправлено получение обновлений.
- `users_command()`: Добавлена команда для отправки статистики пользователей.


## 12 Mar 2023: v4.5

- `get_index()`: Оптимизация функции и формата индексов.
- `_update_index_file()`: Немного изменён формат хранения индексов.
- `count_lessons()`: Использование `collections.Counter()`.
- Незначительные правки в аргументах методов


## 12 Mar 2023: v4.4

- `clear_day_lessons()`: Маленькая функция для очистки списка уроков. 
- `parse_lessons()`: Была вынесена как отдельная функция.
  - Немного оптимизации кода.
  - Вырезан подсчёт хешей для каждого списка уроков.
- `group_update()`: Была удалена, т.к. не используется.


## 10 Mar 2023: v4.3

Начало цикла обновлений с целью полной переработки парсера.

**Schedule**:

- Полное изменение формата списка изменений.
- Функция `get_day_hash()` для получения хеша списка уроков на день.
- Функция `send_cl_updates()` для отправвки изменений "для класса".
- Атрибут `updates` для получение полного списка изменений расписания.

**SPMessages**:

- Вместо `send_update_page() -> send_update()`.

**Telegram**:

- Изменён формат `callback_data` для inline клавиатуры.
- Добавлены описания некоторым функциям.
- Временно убрана возможность получение списка изменений для класса.
- В справке примеры были перемещены верх.


## 3 Mar 2023: v4.2

Само обновление вышло намного-намного раньше, но попало сюда только сейчас.
Зато, можно считать его обкатанным и готовым к выпуску.
Переписана большая часть кода. 
Оптимизация, новые фишечки, упрощение чтения самого кода!

**Schedule**:

- `ScheduleParser`: Стал независимым от пользователей и переимеован в `Schedule`.
- Добавлена аннотация к коду.
- Вместо `os.path.exists` испльзуется `Pathlib`.
- Для ведения журналов отладки добавлено `loguru`.
- Данные парсера сохраняются в директории `sp_data/`, а не в корень проекта.
- `save_file()`: Добавлено автоматическое создание родительских директорий.
- Полностью изменился формат хранения расписания -> лучше читаемость.
- Изменён формат ведения списка изменений.
- Единая функция для получения `l_index, c_index` -> `get_index()`.
- Индексы обновляются разово, вместе с расписанием.
- `_parse_schedule()`: Теперь сам определяет начало нового дня и сколько уроков.
- Обновление расписания перенесено из `get_schedule()` в `_process_update()`.
- `_process_update()`: Добавлен обработчик исключений при неудачной загрузке.
- `_process_update()`: Расписание обновляется теперь точно через 3600 секунд.
- Метод `get_schedule() -> get()`.

**SPMessages**:

- `send_status()`: Новый стиль, также перечисление всхе доступных классов.
- Вместо `send_sc_updates()` используется `get_updates_pages()` и `send_updates_page()`.
- Вновь изменились стили сообщений: `{урок}:{кабинет}`.
- Единая функция для подсчёта уроков/кабинетов `count_lessons()`.
- `count_lessons()`: Отметка кабиентов/уроков, которые используются единожды.
- `search_cabinet()`: Просмотр расписания от имена кабинета.

**И ещё пара незначительных изменений.**


## 21 Dec 2022: v3.2

**Parser**:

- Некоторые атрибуты и методы отмечены приватными.
- Использование `@property` для `l_index, c_index`.

**SPMessages**:

- Исправлен метод подсчёта кабинетов.

**Wrappers**:

- `Console`: Обновлено до `sp v3.2`.
- `Chio`: Обновленио. до `sp v3.2`.
- `Chio`: Добавлена команда для подсчёта кабинетов.


## 12 Dec 2022: v3.1.1

- `Parser`: Изменено обращение с пустыми значениями.


## 6 Dec 2022: v3.1

Небольшой рефакторинг проекта.

**Новые возможности**:

- Просмотр самых частых кабинетов.
- Поиск по урокам/кабинетам.

**Parser**:

- Вынесена функция получение разницы в 2х рассписаниях.
- Изменены некоторые имена атрибутов и методов.
- Индекс уроков теперь группируется и по кабинетам.
- Общий метод поиска по урокам/кабинетам `search()`.

**SPNessages**:

- Методы сборки сообщений были отделены в свой класс.
- Небольшие изменения стиля.

**Wrappers**:

- `Chio`: Обновлено до `sp v3.1`.
- `Console`: Обновлено до `sp v3.1`. 
- `Console`: Добавлена команда для небольшой отладки.


## 27 Nov 2022: Rename tparser -> sparser

Странно что это было сделано только сейчас.

- `Console`: Переписано на `argparse`.


## 23 Nov 2022: v2.4.1

**Parser**:

- Новая система поиска изменений в расписании.
- `get_schedule_diff()`: Полное сравнение 2х расписаний.
- `update_diff_file()`: Сохранение измененй расписания в файл.
- Изменён способ проверки изменений в расписании пользователя.
- `print_sc_changes()`: Отображает изменения в расписании.
- Исправлено отцуцтвие оповещение об изменениях в расписании.
- Исправлено получение расписания на сегодня/завтра.

**Wrappers**:

- `Console`: Обновленио до `sp v2.4.1`.
- `Chio`: Обновлено до `sp v2.4.1`.
- `Chio`: Небольшие обновления.


## 16 Nov 2022: v2.3

**Parser**:

- Изменены имена атрибутов.
- Изменения в структуре `sc.json`.
- Небольшая оптимизация метода `get_lessons_index()`.
- Упрощение метода `count_lessons()`.
- `search_lessons()`, отображения результатов для определённых дней.
- Некоторые изменения в текстах сообщений.

**Wrappers**:

- `Chio`: Совмещены некоторые команды.


## 15 Nov 2022: v2.2

**Parser**:

- Получение индекса уроков.
- Новые методы `get_lessons_index()`, `count_lessons()`, `search_lessons()`.
- В статус добавлена информация о классах и предметах. 

**Wrappers**:

- `Chio`: Обновлено до `sp v2.2`.
- `Chio`: Исправлено получение расписания на завтра.
- `Chio`: Ленивый автопост расписания.
- `Console`: Обновлено до `sp v2.2`.


## 13 Nov 2022: v2.1

**Parser**:

- Добавлены параметры пользователя `set_class`, `last_parse`.
- Обновленён метод сравнения хешей дней для повышения скорости работы.
- Добавлен метод `print_status()` для просмотра информации о парсере.

**Wrappers**:

- Добавлено предупрждение если не указан класс по умолчанию.
- `Chio`: Обновлено до `sp v2.1`.
- `Console`: Обновлено до `sp v2.1`.


## 13 Nov 2022: v2.0

**Parser**:

- `schedule -> lessons`.
- Изменены названия перемнных и параметров для большей понятности.
- Очистка пустых уроков на стадии парсинга расписания.
- В `sc.json` добавлен параметр `last_parse` для отметки последнего обновления.
- Некоторые изменения в стиле сообщений.
- Упрощения кода проверки дней в `print_lessons()`.

**Wrappers**:

- `Console`: Обновлено до `sp v2.0`.
- `Console`: Обновлены описания к командам.


## 7 Nov 2022: v1.6

**Parser**:

- Добавлено расписание звонков.
- Переработка методов получение и парсинга расписания.
- Новые методы `get_class()`, `get_lessons()`, `get_schedule_changes()`.
- Изменены тексты сообщений.
- Исправлен пропуск пустых уроков.
- Добавдено расписание звонков в расписание уроков.
- Метод `print_today_lessons()` для умного получения уроков на сегодня/завтра.

**Wrappers**:

- `Chio`: Обновлено до `sp v1.6`.
- `Chio`: Исправлено получение расписания для других дней.
- `Console`: Обновление до `sp v1.6`.
- `Telegram`: Правки для запуска на `sp v1.6`.


## 23 Oct 2022: v1.4.2

**Parser**:

- В методе `print_lessons()`:
  - Ограничение диапазона дней.
  - Удаление повторов в днях.
  - Сортировка дней по возврастанию.


## 21 Oct 2022: Chio

- `Chio`: Обновлено до `sp v1.4`.


## 18 Oct 2022: v1.4 

- Небольшая чистка кода

**Parser**:

- Отображение расписания для дней, где оно изменилось.
- Отсечение пустых уроков с конца.

**Wrappers**:

- `Console`: Получение расписания на всю неделю.


## 17 Oct 2022: v1.3 

- `Parser`: Возможность получения расписания не несколько дней.


## 16 Oct 2022: v1.2 

- `Parser`: Исправлено получение расписания для других классов.


## 14 Oct 2022: v1.1 

**Parser**:

- Исправлен парсинг субботы.
- Добавлен аргумент `update=False`, для принудительного обновления.

**Wrappers**:

- `Console`: parse - принудительно обновить расписание.


## 12 Oct 2022: v1.0

**Parser**:

- Вынесен в отдельный файл `sparser.py`.
- Добавлены оповещения об изменениях в расписании.
- Убрано парсирование расписания звонков.

**Wrappers**:

- `Telegram`: Обновлён и немного исправлен код.
- `Console`: Добавлена лёгкая обёртка над парсером.


## 10 Oct 2022: v1.0m

Основан на оригинальном исходном коде от Артёма Березина.

**Отличия от оригинала**:

- Исправлены зависимости.
- Подчищен код.
- Переписан парсер.
- Исправлены некоторые проблемы.
- Немного переписаны тексты сообщений.
- Убрано упоминание ВПР.
- Добавлена возможность сохранения данных в файл.
